package simulator;


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;
import ecole.organisation.Ecole;
import ecole.organisation.Enseignement;
import ecole.organisation.Formation;
import ecole.organisation.Groupe;
import ecole.organisation.Seance;
import ecole.utilisateur.Professeur;



import reservation.Reservation;

/**
 * Interface permettant au professeur responsable d'un enseignement de gérer ses seances
 * @author Luttiau Hadrien
 *
 */
public class InterfaceRE extends Interface{
	
	private Scanner sc ;

	public InterfaceRE(){}

	public InterfaceRE(Ecole ec){
		super(ec);
		this.bienvenue = "\n*************** BIENVENUE **********************\n"+
				"* Espace reservé aux responsables d'enseignement *\n"+
				"************************************************";
	}

	protected void verifProfRespo(String nom, String prenom){
		if(this.ecole.rechercheProfesseurParNomPrenom(nom, prenom) != null){ //verifie existe dans la liste des enseignants
			this.prof = this.ecole.rechercheProfesseurParNomPrenom(nom, prenom);
			if(this.ecole.profEstRespEns(prof) != null){
				saisieId();
			}
			else{
				System.out.println("Le professeur " +nom+ " " +prenom+ " n'est responsable d'aucun enseignement");
				affichage();
			}
		}
		else{
			System.out.println("Aucun professeur n'a l'identité suivante : \n\t Nom : " +nom+ "\n\t Prenom : " +prenom);
			affichage();
		}
	}

	protected void menu() {
		System.out.println("\n");
		System.out.println("*************************************");
		System.out.println("*************** MENU ****************");
		System.out.println("*************************************");
		System.out.println("-- 1 Réserver une salle");
		System.out.println("-- 2 Accéder à mes réservations");
		System.out.println("-- 3 Quitter");

		int choix = 0;
		sc = new Scanner(System.in);
		try{
			choix = sc.nextInt();
		}
		catch(Exception e){
			System.out.println("Veuillez saisir un entier.");
			menu();
			return ;
		}
		if (choix<1 || choix>3){
			System.out.println("Veuillez saisir l'une des options propos�es: 1, 2 ou 3.");
			menu();
			return ;
		}
		else
		{
			switch(choix){
			case(1) :
				reserver(this.prof);
			break;
			case(2) :
				accesResa(this.prof);
			break;
			case(3) :
				affichage();
			break;
			}
		}
	}

	private void accesResa(Professeur prof) {
		Reservation resa = new Reservation();
		resa.afficherMesReservations(prof);
		menu();

	}
	private void reserver(Professeur prof) {
		System.out.println("\n");
		System.out.println("**********************************************************************");
		System.out.println("*** Entrez votre réservation en saisissant les élements demandés : ***");
		System.out.println("**********************************************************************");
		form = choixFormation(prof);	// Choix de la formation
		ens = choixEnseignement(prof);		// Choix de l'enseignement
		Groupe gpChoisi = choixGroupe(ens);				// Choix du groupe
		int typeSalle = choixTypeSalle(gpChoisi);				// Choix du type de la salle
		Date date = choixDate();						// Choix de la date
		int creneauSaisi = choixCreneau();				// Choix du creneau
		int effectifSaisi = gpChoisi.getCapacite();
		confirmation(prof, ens, typeSalle, date, creneauSaisi, effectifSaisi, gpChoisi);
		Reservation r = new Reservation();
		r.afficherMesReservations(prof);
		plusieursCreneaux(r.getSeance(),typeSalle);
		plusieursSemaines(r.getSeance(), typeSalle);
		reserver(prof);
	}



	private void plusieursSemaines(Seance seance, int typeSalle) {
		System.out.println("Souhaitez vous reserver la meme seance sur plusieurs semaines ? (1 => Oui  || 0 => Non");
		if (sc.nextInt() == 1)
		{
			Reservation r = new Reservation();
			System.out.println("\nCréneaux disponibles: " + r.getCreneauxDisponibles(seance.getCreneau()));
			System.out.println("Veuillez saisir au moins 2 créneaux pour lesquels vous souhaitez effectuer la précédente réservation, séparés par une virgule et sans espace.");
			System.out.println("Exemple: O,2");
			String nbCreneaux = sc.nextLine();
			if (!nbCreneaux.matches(motifCreneaux)){
				System.out.println("Veuillez saisir uniquement les chiffres proposés, séparés par une virgule et sans espace.");
				plusieursSemaines(seance, typeSalle);
			} 
			else 
			{
				r.reserverCreneaux(prof,seance,typeSalle,nbCreneaux);
				r.afficherConfirmationMultiple();		/* Afficher la confirmation de réservation */

			}
			System.out.println("Veuillez saisir uniquement les chiffres proposés, séparés par une virgule et sans espace.");
		}
	}

	private void plusieursCreneaux(Seance s, int typeSalle) {
		System.out.println("Souhaitez vous reserver un autre créneau ? (1 => Oui  || 0 => Non)");
		int choix = 0;
		try {
			choix = sc.nextInt();
		} catch (Exception e) {
			System.out.println("Veuillez saisir uniquement 1 ou 0 ");
			e.printStackTrace();
		}
		if ( choix == 1)
		{
			System.out.println("\nPour combien de semaines voulez-vous effectuer la précédente réservation ?");
			int nbSemaines = sc.nextInt();
			if (nbSemaines<1) {
				System.out.println("Saisissez un nombre de semaines posisitif.");
				plusieursCreneaux(s, typeSalle);
			} 
			else {
				Reservation r = new Reservation();
				r.reserverSemaines(prof,s,typeSalle,nbSemaines);
				r.afficherConfirmationMultiple();		/* Afficher la confirmation de réservation */
			}
		}
	}

	private Formation choixFormation(Professeur prof) {
		System.out.println("-- Choisissez pour quel formation vous souhaitez faire la réservation :");
		ArrayList<Formation> listForm = new ArrayList<Formation>();
		for (int i = 0 ; i< ecole.getListeFormation().size() ; i++)
		{
			for (int j = 0 ; j < ecole.getListeFormation().get(i).getListeEnseignement().size() ; j++ )
			{
				if (ecole.getListeFormation().get(i).getListeEnseignement().get(j).getRespEnseignement().equals(prof) && !listForm.contains(ecole.getListeFormation().get(i)))
					listForm.add(ecole.getListeFormation().get(i));
			}
		}
		int k = 0;
		for (Formation form : listForm)
		{
			k++;
			System.out.println("\t"+k+" - "+form.getIdFormation());
		}
		int choix = -1;
		try{
			choix = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(2);
			choixFormation(prof);
		}

		if(choix == 0)
			menu();
		else if(choix < 0 || choix > k){
			erreurSyntaxe(3);
			choixFormation(prof);
		}
		else
			return listForm.get(choix-1);
		return null;
	}

	private Groupe choixGroupe(Enseignement ens) {
		System.out.println("-- Choisissez pour quel groupe vous souhaitez faire la réservation :");
		System.out.println("\t1 - "+"Toute la promotion");
		System.out.println("\t2 - "+"TD");
		System.out.println("\t3 - "+"TP");
		int choix = -1;
		try{
			choix = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(2);
			choixGroupe(ens);
		}

		if(choix == 0)
			menu();
		else if(choix <0 || choix > 3){
			erreurSyntaxe(3);
			choixGroupe(ens);
		}
		else if(choix == 2){
			return choixGroupeTD();
		}
		else if(choix == 3){
			return choixGroupeTP();
		}
		return form.getGroupeAmphi();
	}

	public Groupe choixGroupeTD(){
		int compt = 0;
		System.out.println("*********** Choix du groupe de TD : **********");
		for(Groupe grp : form.getListeGroupeTD()){
			compt++;
			System.out.println("\t"+compt+" - "+grp.getNomGroupe());
		}
		int choix = -1;
		try{
			choix = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(2);
			choixGroupeTD();
		}
		if(choix == 0)
			menu();
		else if(choix <0 || choix > compt){
			erreurSyntaxe(3);
			choixGroupeTD();
		}
		if (! form.getListeGroupeTD().get(choix-1).groupeVide() )
			return form.getListeGroupeTD().get(choix-1);
		else
		{
			System.out.println("Ce groupe est vide !");
			choixGroupeTD();
			return null;
		}
	}

	public Groupe choixGroupeTP(){
		int compt = 0;
		System.out.println("*********** Choix du groupe de TP : **********");
		for(Groupe grp : form.getListeGroupeTP()){
			compt++;
			System.out.println("\t" +compt+" - "+grp.getNomGroupe());
		}
		int choix = -1;
		try{
			choix = sc.nextInt();
		}catch(Exception e){
			erreurSyntaxe(2);
			choixGroupeTP();
		}
		if(choix == 0)
			menu();
		else if(choix < 0 || choix > compt){
			erreurSyntaxe(3);
			choixGroupeTP();
		}
		if (! form.getListeGroupeTP().get(choix-1).groupeVide() )
			return form.getListeGroupeTP().get(choix-1);
		else
		{
			System.out.println("Ce groupe est vide !");
			choixGroupeTP();
			return null;
		}
	}

	private Enseignement choixEnseignement(Professeur prof) {
		ArrayList<Enseignement> listeEns = ecole.profEstRespEns(prof);
		System.out.println("-- Choisissez pour quel enseignement vous souhaitez faire la réservation :");
		for (int i = 0 ; i<listeEns.size() ; i++)
		{
			System.out.println("\t"+(i+1) + " - "+listeEns.get(i).getNomEnseignement());
		}
		int choix = sc.nextInt();
		for (int i = 0 ; i<listeEns.size() ; i++)
		{
			if ( choix == (i+1) )
			{
				return listeEns.get(i);
			}
		}
		System.out.println("Saisie incorrecte veuillez recommencer");
		choixEnseignement(prof);
		return null;
	}
	private int choixTypeSalle(Groupe gp) {
		if ( gp.getTypeGroupe().equals("Amphi") )
		{
			System.out.println(" -- Type de salle ( 0 => Amphi || 1 => Cours || 2 => Réunion )");
		}
		else if ( gp.getTypeGroupe().equals("TD") )
		{
			System.out.println(" -- Type de salle ( 1 => Cours || 3 => TD )");
		}
		else if ( gp.getTypeGroupe().equals("TP") )
		{
			System.out.println(" -- Type de salle (  4 => TP machines portables || 5 => TP machines portables )");
		}
		else
		{
			System.out.println("Saisie groupe incorrecte !");
			menu();
			return -1;
		}

		//System.out.println("-- Type de salle (0:Amphi /1:Cours /2:Réunion /3:TD /4:TP machines fixes /5:TP machines portables) :");
		int ts = 0;
		//sc = new Scanner(System.in);
		try{
			ts = sc.nextInt();
		}
		catch (Exception e){
			erreurSyntaxe(2);
			return choixTypeSalle(gp);
		}
		if (ts<0 || ts>5){
			System.out.println("Veuillez saisir l'un des types proposées.");
			return choixTypeSalle(gp);
		}
		else
			return ts;
	}

	private Date choixDate() {
		Calendar calDateCourante = Calendar.getInstance();
		SimpleDateFormat dateFormatee = new SimpleDateFormat("dd/MM/yyyy");
		dateFormatee.setLenient(false);				// Permet de relever une exception si le format est invalide

		System.out.println("-- Entrez la date souhait�e (jj/mm/aaaa) :");
		sc = new Scanner(System.in);
		String dateSaisie = sc.nextLine();
		String tabDateSaisie[] = dateSaisie.split("/");
		Calendar calDateSaisie = null;
		try{
			calDateSaisie = new GregorianCalendar(Integer.parseInt(tabDateSaisie[2]),Integer.parseInt(tabDateSaisie[1])-1,Integer.parseInt(tabDateSaisie[0]));
		}
		catch (Exception e)
		{
			System.out.println("Le format de la date est invalide.\nVeuillez saisir a nouveau une date en respectant le format jj/mm/aaaa.");
			return choixDate();
		}
		if (!dateSaisie.matches(motifDate)) {
			System.out.println("Veuillez saisir la date en respectant le format: jj/mm/aaaa");
			return choixDate();
		} else if (calDateSaisie.before(calDateCourante)) {
			System.out.println("Vous ne pouvez r�server pour une date ant�rieure � la date d'aujourd'hui.\n Veuillez saisir une date postérieure a celle d'aujourd'hui.");
			return choixDate();
		} else {
			return calDateSaisie.getTime();
		}
	}

	private int choixCreneau() {
		System.out.println("-- Créneau (0:8H-10H /1:10H15-12H15 /2:13H30-15H30 /3:15H45-17H45) :");
		int creneauSaisi = 0;
		sc = new Scanner(System.in);
		try {
			creneauSaisi = sc.nextInt();
		}
		catch(Exception e){
			System.out.println("Veuillez saisir un entier.");
			return choixCreneau();
		}
		if (creneauSaisi<0 || creneauSaisi>3) {
			System.out.println("Veuillez saisir l'un des créneaux proposés: 0, 1, 2 ou 3.");
			return choixCreneau();
		} 
		else
			return creneauSaisi;
	}


	private void confirmation(Professeur prof,Enseignement ens, int typeSalle, Date date,int creneauSaisi, int effectifSaisi, Groupe gp) {

		String tabCreneaux[] = {"8H à 10H","10H15 à 12H15", "13H30 à 15H30", "15H45 à 17H45"};
		String tabSalle[] = {"amphi","de cours","de reunion","de TD","de TP fixe", "de TP machine"};
		System.out.println("\nRécapitulatif de votre réservation :");
		System.out.println("- Une salle "+ tabSalle[typeSalle] + " de " + effectifSaisi + " places pour le "+ date.toString() +" de "+ tabCreneaux[creneauSaisi] +". ");
		System.out.println("Voulez-vous confirmer cette réservation ? (1 => oui / 0 => non)");

		int choixSaisi = 0;
		sc = new Scanner(System.in);
		try {
			choixSaisi = sc.nextInt();
		}
		catch(Exception e){
			System.out.println("Veuillez saisir uniquement 1 pour oui ou 0 pour non.");
			confirmation(prof, ens, typeSalle, date, creneauSaisi, effectifSaisi, gp);
			return ;
		}
		//Reservation r = new Reservation();
		switch(choixSaisi){
		case 1:
			Seance seance = new Seance(ens, prof, date, creneauSaisi, gp);
			Reservation.reserver(prof,seance ,typeSalle);
			break;
		case 0:
			menu();
			break;
		default :
			System.out.println("Veuillez saisir uniquement 1 pour oui ou 0 pour non.");
			confirmation(prof, ens, typeSalle, date, creneauSaisi, effectifSaisi, gp);
			return;
		}

	}



	/**
	 * Ouvre une fen�tre de message d'erreur
	 * 
	 * @param message : le message d'erreur � afficher
	 * @param title : le titre de la fen�tre
	 */
	/*private static void showErrorPane(String message, String title) {
		JOptionPane pane = new JOptionPane(message, JOptionPane.ERROR_MESSAGE);
		JDialog dialog = pane.createDialog(title);
		dialog.setAlwaysOnTop(true);
		dialog.setVisible(true);
	}
	 */

}
